package server;
import server.exception.NotInStockException;
import server.exception.OutOfStockException;

/**
 * Diese Klasse stellt ein Lager dar, welches verschiede Produkte (in Gebinden) hält.
 * Da viele Kunden (threads) gleichzeitig Zugriff auf den Stock haben, muss diese Klasse natürlich Thread-Safe sein. 
 * 
 * @author reto
 *
 */
public class Stock extends AbstractStock{

	public Stock()
	{
		super();	
	}
	public Stock(final ProductLot... productLots) {
		super(productLots);
	}

	
	/**
	 * Akzeptiert nur Produkte, welche auch tatsächlich im Stock vertreten werden. 
	 * @param product Das Produkt, welches entfernt werden soll.
	 * @throws NotInStockException Falls das zu entfernende Produkt nie in der Produktepalette des Shops aufgenommen wurde.
	 * @throws OutOfStockException Falls das Gebinde für das zu entfernende Produkt keine Einheiten mehr hat.
	 */
	@Override
	public synchronized Product removeProduct(final String productName) throws OutOfStockException, NotInStockException
	{
		if(!super.getProductLots().containsKey(productName)) {
			throw new NotInStockException(productName);
		}		
		if(super.getProductLots().get(productName).getAmount()<=0)
		{
			throw new OutOfStockException(super.getProductLots().get(productName));
		}
		super.getProductLots().get(productName).remove();
		return super.getProductLots().get(productName).getProduct();
	}		
}
